package com.aiwiown.snackmq.cluster.routing;

import com.aiwiown.snackmq.common.message.Message;
import com.aiwiown.snackmq.common.routing.ExchangeType;

import java.io.Serializable;
import java.util.List;

/**
 * 交换机接口，定义了所有交换机类型的核心行为。
 */
public interface Exchange extends Serializable {

    // 默认的直连交换机名称
    String DEFAULT_DIRECT_EXCHANGE = "";

    /**
     * 获取交换机的名称
     * @return 交换机的名称
     */
    String getName();

    /**
     * 获取交换机的类型
     * @return 交换机的类型
     */
    ExchangeType getType();

    /**
     * 为此交换机添加一个绑定。
     * @param binding 绑定关系
     */
    void addBinding(Binding binding);

    /**
     * 移除一个绑定。
     * @param binding 待移除的绑定关系
     */
    void removeBinding(Binding binding);

    /**
     * 根据消息的 routingKey 和交换机类型，计算出目标队列（Topic）列表。
     * @param message 待路由的消息
     * @return 匹配的目标队列名称列表
     */
    List<String> route(Message message);

    /**
     * 新增：获取此交换机的所有绑定关系。
     * @return 一个包含所有 Binding 对象的列表。
     */
    List<Binding> getBindings();
}
